home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Fix.h < prev    next >
C/C++ Source or Header  |  2000-01-16  |  5KB  |  187 lines

  1. #include <math.h>
  2.  
  3. #define PI            3.1415926535897932
  4. #define angle2fix    40.74366543153        
  5. #define fix2angle    0.02454369260617    
  6.  
  7. extern int cosine_table[], arccosine_table[], tangent_table[];
  8.  
  9. class fix
  10. {
  11.   private:
  12.     int v;
  13.     
  14.     static int itofix(int x) 
  15.     { 
  16.         return x << 8; 
  17.     }
  18.     
  19.     static int fixtoi(int x) 
  20.     { 
  21.         return (x >> 8) + ((x & 0x80) >> 7); 
  22.     }
  23.     
  24.     static int ftofix(double x) 
  25.     {
  26.         return (int)(x * 256.0 + (x < 0 ? -0.5 : 0.5)); 
  27.     }
  28.     
  29.     static double fixtof(int x) 
  30.     { 
  31.         return (double)x / 256.0; 
  32.     }
  33.     
  34.     static int fmul(int x, int y) 
  35.     { 
  36.         int t;
  37.         
  38.         __asm
  39.         {
  40.             mov eax, x
  41.             mov ecx, y
  42.             imul ecx
  43.             shrd eax, edx, 8        
  44.             mov t, eax        
  45.         }
  46.         
  47.         return t;
  48.     }
  49.     
  50.     static int fdiv(int x, int y)
  51.     {
  52.         int t;
  53.         
  54.         __asm
  55.         {
  56.             mov eax, x
  57.             mov edx, eax
  58.             shl eax, 8
  59.             sar edx, 24
  60.             mov ecx, y
  61.             idiv ecx
  62.             mov t, eax
  63.         }
  64.         
  65.         return t;
  66.     }
  67.     
  68.   public:
  69.     fix() { }
  70.     fix(const fix &x) { v = x.v; }
  71.     fix(const int x) { v = itofix(x); }
  72.     fix(const long x) { v = itofix(x); }
  73.     fix(const unsigned int x) { v = itofix(x); }
  74.     fix(const unsigned long x) { v = itofix(x); }
  75.     fix(const double x) { v = ftofix(x); }
  76.     
  77.     operator int() const { return fixtoi(v); }
  78.     operator long() const { return fixtoi(v); }
  79.     operator unsigned int() const { return fixtoi(v); }
  80.     operator unsigned long() const { return fixtoi(v); }
  81.     operator double() const { return fixtof(v); }
  82.     
  83.     fix &operator = (const fix &x) { v = x.v; return *this; }
  84.     fix &operator = (const int x) { v = itofix(x); return *this; }
  85.     fix &operator = (const long x) { v = itofix(x);    return *this; }
  86.     fix &operator = (const unsigned int x) { v = itofix(x); return *this; }
  87.     fix &operator = (const unsigned long x) { v = itofix(x); return *this; }
  88.     fix &operator = (const double x) { v = ftofix(x); return *this; }
  89.     
  90.     fix &operator += (const fix x) { v += x.v; return *this; }
  91.     fix &operator -= (const fix x) { v -= x.v; return *this; }
  92.     fix &operator *= (const fix x) { v = fmul(v, x.v); return *this; }
  93.     fix &operator *= (const int x) { v *= x; return *this; }
  94.     fix &operator /= (const fix x) { v = fdiv(v, x.v); return *this; }
  95.     fix &operator /= (const int x) { v /= x; return *this; }
  96.     fix &operator <<= (const int x) { v <<= x; return *this; }
  97.     fix &operator >>= (const int x) { v >>= x; return *this; }
  98.     fix &operator &= (const int x) { v &= (x << 8) + 0xff; return *this; }
  99.     
  100.     fix &operator ++ () { v += itofix(1); return *this; }
  101.     fix &operator -- () { v -= itofix(1); return *this; }
  102.     
  103.     fix operator - () { fix t; t.v = -v; return t; }
  104.     
  105.     friend fix operator + (const fix x, const fix y) { fix t; t.v = x.v + y.v; return t; }
  106.     friend fix operator - (const fix x, const fix y) { fix t; t.v = x.v - y.v; return t; }
  107.     friend fix operator * (const fix x, const fix y) { fix t; t.v = fmul(x.v, y.v); return t; }
  108.     friend fix operator * (const fix x, const int y) { fix t; t.v = x.v * y; return t; }
  109.     friend fix operator * (const int x, const fix y) { fix t; t.v = y.v * x; return t; }
  110.     friend fix operator / (const fix x, const fix y) { fix t; t.v = fdiv(x.v, y.v); return t; }
  111.     friend fix operator / (const fix x, const int y) { fix t; t.v = x.v / y; return t; }
  112.     friend fix operator << (const fix x, const int y) { fix t; t.v = x.v << y; return t; }
  113.     friend fix operator >> (const fix x, const int y) { fix t; t.v = x.v >> y; return t; }
  114.     
  115.     friend int operator == (const fix x, const fix y) { return (x.v == y.v); }
  116.     friend int operator != (const fix x, const fix y) { return (x.v != y.v); }
  117.     friend int operator < (const fix x, const fix y) { return (x.v < y.v);  }
  118.     friend int operator > (const fix x, const fix y) { return (x.v > y.v);  }
  119.     friend int operator <= (const fix x, const fix y) { return (x.v <= y.v); }
  120.     friend int operator >= (const fix x, const fix y) { return (x.v >= y.v); }
  121.     
  122.     friend fix cos(fix x) 
  123.     { 
  124.         fix t;  
  125.         
  126.         t.v = cosine_table[((x.v & 0x40)? (x.v >> 7) + 1 : (x.v >> 7)) & 0x1ff];      
  127.         
  128.         return t; 
  129.     }
  130.     
  131.     friend fix sin(fix x) 
  132.     { 
  133.         fix t;  
  134.         
  135.         t.v = cosine_table[(((x.v & 0x40)? (x.v >> 7) + 1 : (x.v >> 7)) - 128) & 0x1ff];
  136.         
  137.         return t; 
  138.     }
  139.     
  140.     friend fix tan(fix x) 
  141.     { 
  142.         fix t;  
  143.         
  144.         t.v = tangent_table[((x.v & 0x40)? (x.v >> 7) + 1 : (x.v >> 7)) & 0xff]; 
  145.         
  146.         return t; 
  147.     }
  148.     
  149.     friend fix acos(fix x) 
  150.     { 
  151.         fix t;  
  152.         
  153.         t.v = x.v < -256 || x.v > 256? 0 : arccosine_table[x.v + 256];
  154.         
  155.         return t; 
  156.     }
  157.     
  158.     friend fix asin(fix x)
  159.     {
  160.         fix t;  
  161.         
  162.         t.v = x.v < -256 || x.v > 256? 0 : 0x4000 - arccosine_table[x.v + 256];
  163.         
  164.         return t; 
  165.     }
  166.     
  167.     friend fix atan(fix x)
  168.     {
  169.         return (fix)(angle2fix * atan((double)x));
  170.     }
  171.  
  172.     friend fix atan2(fix x, fix y)
  173.     {
  174.         return (fix)(angle2fix * atan2((double)x, (double)y));
  175.     }
  176.  
  177.     friend fix sqrt(fix x)
  178.     {
  179.         return (fix)sqrt((double)x);
  180.     }    
  181.  
  182.     friend fix abs(fix x)
  183.     {
  184.         return x < (fix)0? -x:x;
  185.     }
  186. };
  187.